<?php


namespace app\common\service\order\coupon_order\jd_union;


use app\common\service\order\coupon_order\Base;
use app\common\service\order\coupon_order\CouponOrderChannelInterface;
use app\model\Agent;
use app\model\CouponOrder;
use think\Exception;
use app\model\CouponOrderSid;


abstract class JingDongUnionBase extends Base implements  CouponOrderChannelInterface
{

    public function getAgentId()
    {

        if (!Agent::find($this->_agent_id)) {
            $msg = '代理商不存在，过滤了' ;
            \think\facade\Log::info($msg);
            throw new Exception($msg);
        };

        $this->processSid();

        if (empty($this->couponOrderSid)) {
            throw new Exception('非惠充京东订单', Base::INFO_CODE);
        }

//过滤掉不是京喜是数据
        if ($this->couponOrderSid->remark != CouponOrderSid::REMARK_JX) {
            throw new Exception('非惊喜订单', Base::INFO_CODE);
        }

        return $this->_agent_id;

    }

    /**
     * 获取第三方唯一订单号
     * @return string
     * 已确定---验证正确
     */
    public function getSupplierOrderSn()
    {
        return $this->params['orderId'];
    }

    /**
     * 获取实际支付价格
     * todo 正确性待确定
     */
    public function getAmount()
    {
//        //todo 不考虑优惠券，用户实际支付的价格就是price*skuNum
//        $price = $this->params['price'];
//        $skuNum = $this->params['skuNum'];
//        return yuan2fen(bcmul($price, $skuNum, 2));

        //预估计佣金额
        $estimateCosPrice = $this->params['estimateCosPrice'];

        //实际计算佣金的金额
        $actualCosPrice = $this->params['actualCosPrice'];

        //推客分得的实际佣金
        $actualFee = $this->params['actualFee'];

        // todo 推客分得的实际佣金不为空且大于0则取实际计算佣金的金额，否则取预估计佣金额
        if (isset($actualFee) && $actualFee > 0 ) {
            return yuan2fen($actualCosPrice);
        } else {
            return yuan2fen($estimateCosPrice);
        }
    }

    /**
     * 总利润
     * todo 所取字段待验证
     */
    public function getOrderAllCommission()
    {
        //推客分得的实际佣金
        //实际佣金
        if ($this->params['actualFee'] > 0) {
            return $this->params['actualFee'];
        } else {
            //预计佣金
            return $this->params['estimateFee'];
        }
    }

    /**
     * 原价
     */
    public function getOriginAmount()
    {

    }

    /**
     * 用户支付金额
     * todo 需要确定
     */
    public function getPayAmount()
    {
        return $this->getAmount();
    }

    /**
     * 支付状态
     * https://pic.rmb.bdstatic.com/bjh/2265d040b1c0acaaaba180b1e8030577.jpeg
     * todo 需要确定
     */
    public function getPayStatus()
    {
        // 16.已付款,17.已完成,
        $validCode = $this->params['validCode'];
        if (in_array($validCode, [16, 17])) {

            return CouponOrder::C_PAY_STATUS_YES;

        } else {

            return CouponOrder::C_PAY_STATUS_NO;

        }
//        if ($this->params['validCode'] == 15) {
//            return CouponOrder::C_PAY_STATUS_NO;
//        } else {
//            return CouponOrder::C_PAY_STATUS_YES;
//        }
    }

    /**
     * 判断是否产生退款
     * @returns bool
     */
    public function checkRefundStatus()
    {
        return false;
    }

    /**
     * 退款状态
     * todo  已验证    3 是退款完成
     * todo  退款中
     */
    public function getRefundStatus()
    {
        /**
         * @var CouponOrder $couponOrder
         * refund_status 退款状态 1未退款 2退款中 3已退款
         * C_REFUND_STATUS_NO   =  1; // 未退款
         * C_REFUND_STATUS_ING  =  2; // 退款中
         * C_REFUND_STATUS_HAVE =  3; // 已退款
         */
        $orderId = $this->params['orderId'];
        $validCode = $this->params['validCode'];
        //本次更新的实际佣金
        if ($this->params['actualFee'] > 0) {
             $newFee = $this->params['actualFee'];
        } else {
            //预计佣金
            $newFee = $this->params['estimateFee'];
        }
        $couponOrder = CouponOrder::query()->where('out_order_id', $orderId)->find();
        if ($couponOrder && $couponOrder->pay_status == CouponOrder::C_PAY_STATUS_YES) {
            //TODO 判断方式一、新的佣金比之前的佣金少，并且validCode不是 2.无效-拆单则判定是产生了退款行为
            //TODO 判断方式二、之前是已付款或者已完成的订单，变成了validate=3，则判断是产出了退款行为
            //TODO 根据观察，京东没有退款中这个状态，要么是没有产生退款，要么是退款完成
            $old_ext_data = $couponOrder->ext_data;

            if (empty($old_ext_data)){
                return CouponOrder::C_REFUND_STATUS_NO;
            }
            if (!is_array($old_ext_data)){
                $old_ext_data = json_decode($couponOrder->ext_data,true);
            }
            //上一次系统存储的实际佣金
            if ($old_ext_data['actualFee']??0 > 0) {
                $oldFee = $old_ext_data['actualFee']??0;
            } else {
                $oldFee = $old_ext_data['estimateFee']??0;
            }
            if ($validCode != 2 && $newFee < $oldFee) { //产生了退款
                if ( $newFee <= 0 ) { //佣金小于等于0，说明是全额退款
                    return CouponOrder::C_REFUND_STATUS_HAVE;
                } else {  //todo 部分退款....

                }
            }
        }
        //未产生退款
        return CouponOrder::C_REFUND_STATUS_NO;

    }


    /**
     * 退款金额
     * todo 需要确定，需要判断是否产生部分退款
     */
    public function getRefundAmount()
    {
        return 0;
    }


    /**
     * 支付时间
     * 确定
     */
    public function getPayTime()
    {
//        if ($this->params['validCode'] != 15) {
//            return $this->params['orderTime'];
//        }
        //没有支付不产生支付时间
        $validCode = $this->params['validCode'];
        if (in_array($validCode, [16, 17])) {

            return $this->params['orderTime'];

        }
    }


    /**
     * 状态描述
     * 确定，可以返回空
     */
    public function getStatusDesc()
    {
        return '';
    }


    /**
     * 子类型
     * 确定
     */
    public function getType()
    {
        return CouponOrder::TYPE_MOBILE_CPS;
    }

    /**
     * 结算类型
     * 确定
     */
    public function getSettleType()
    {
        return CouponOrder::C_SETTLE_TYPE;
    }

    /**
     * 扩展信息
     * 确定
     */
    public function getExtData()
    {
        return $this->params;
    }

    /**
     * 订单创建时间
     * 确定
     */
    public function getOrderCreatedAt()
    {
        return $this->params['orderTime'];
    }

    /**
     * 标题
     * 确定
     */
    public function getTitle()
    {
        return '京喜话费';
    }


    /**
     * 重要 sid
     * 确定
     */
    public function getSid()
    {
        return $this->params['subUnionId'];
    }

    /**
     * 第三方订单信息
     * 确定
     */
    public function getOutOrderId()
    {
        return $this->params['orderId'];
    }

}